package com

import java.text.DecimalFormat

/**
 * 控制台字符型进度条。
 * @author
 */
class ConsoleProgressBar {
    private var minimum: Long = 0 // 进度条起始值

    private var maximum: Long = 100 // 进度条最大值

    private var barLen: Long = 100 // 进度条长度

    private var showChar = '=' // 用于进度条显示的字符

    private val formater = DecimalFormat("#.##%")

    var startChar: String = ""

    /** 详情  */
    var details: String = ""

    /**
     * 使用系统标准输出，显示字符进度条及其百分比。
     */
    constructor()

    /**
     * 使用系统标准输出，显示字符进度条及其百分比。
     *
     * @param minimum  进度条起始值
     * @param maximum  进度条最大值
     * @param barLen   进度条长度
     * @param showChar 用于进度条显示的字符
     */
    /**
     * 使用系统标准输出，显示字符进度条及其百分比。
     *
     * @param minimum 进度条起始值
     * @param maximum 进度条最大值
     * @param barLen  进度条长度
     */
    @JvmOverloads
    constructor(
        minimum: Long, maximum: Long,
        barLen: Long, showChar: Char = '='
    ) {
        this.minimum = minimum
        this.maximum = maximum
        this.barLen = barLen
        this.showChar = showChar
    }

    /**
     * 显示进度条。
     *
     * @param value 当前进度。进度必须大于或等于起始点且小于等于结束点（start <= current <= end）。
     */
    fun show(value: Long) {
        if (value < minimum || value > maximum) {
            return
        }

        reset()
        minimum = value
        val rate = (minimum * 1.0 / maximum).toFloat()
        val len = (rate * barLen).toLong()
        draw(len, rate)
        if (minimum == maximum) {
            afterComplete()
        }
    }

    private fun draw(len: Long, rate: Float) {
        print(startChar)
        for (i in 0 until len) {
            print(showChar)
        }
        print(' ')
        print(format(rate))
        print(" $details")
    }

    private fun reset() {
        print('\r')
    }

    private fun afterComplete() {
        print('\n')
    }

    private fun format(num: Float): String {
        return formater.format(num.toDouble())
    }
}
